package com.qidian.mes.sys.controller;

import com.alibaba.excel.EasyExcel;
import com.qidian.mes.desensitivity.DesensitivityAnnotation;
import com.qidian.mes.desensitivity.DesensitivityUtil;
import com.qidian.mes.pojo.User;
import com.qidian.mes.sys.excel.listener.UserExcelParseListener;
import com.qidian.mes.sys.service.UserService;
import com.qidian.mes.util.Tools;
import com.qidian.mes.util.dot.PagerDTO;
import com.qidian.mes.util.pojo.QdResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Author 戴着假发的程序员
 * @Company 起点编程
 * @Description
 * @Time 2024/4/11 11:34
 */
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/import")
    public QdResult importUser(MultipartFile file) throws IOException {
        // 批量的导入数据
        // 准备一个UserExcelParseListener  这个Listener不能被Spring管理，我们只能自己new出来。
        UserExcelParseListener listener = new UserExcelParseListener(userService);
        // 读取数据
        EasyExcel.read(file.getInputStream(),User.class,listener).sheet("用户信息").doRead();
        return QdResult.success("成功导入" + listener.getCount() + "条用户数据");
    };

    // 这个方法需要一个response，我们直接传入即可
    @GetMapping("/export")
    public void export(User user, @RequestParam(defaultValue = "1")int page, @RequestParam(defaultValue = "10")int limit, HttpServletResponse response) throws IOException {
        // 查询数据
        QdResult<PagerDTO<User>> qdResult = userService.queryByPage(user, page, limit);
        List<User> users = qdResult.getData().getData();
        // 脱敏处理
        users.forEach(u -> DesensitivityUtil.desensitization(u));
        // 导出
        try {
            // 设置contentType为excel的格式
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("用户信息-" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");
            // 让文件以附件的形式下载
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息")
                    .doWrite(users);
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().println(Tools.object2json(QdResult.error("下载文件失败")));
        }
    }

    @PostMapping("/save")
    public QdResult saveUser(@RequestBody  User user) {
        return userService.saveUser(user);
    }

    @GetMapping("/queryByPage")
    public QdResult queryByPage(User user,@RequestParam(defaultValue = "1")int page,@RequestParam(defaultValue = "10")int limit){
        return userService.queryByPage(user,page,limit);
    }
}
